#include <iostream>
#include <string>
#include <regex>

int main()
{
    //HTTP请求行格式： GET /hdm/login?user=zhangsan&pass=123123 HTTP/1.1\r\n
    std::string str="GET /hdm/login?user=zhangsan&pass=123123 HTTP/1.1\r\n";
    std::smatch matches;
    //请求方法的匹配 GET HEAD POST PUT DELETE....
    std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    //"(GET|HEAD|POST|PUT|DELETE) ([^?]*)\\?(.*) (HTTP/1\\.[01])(?:\n|\r\n)?"
    //GET|HEAD|POST|PUT|DELETE 表示匹配并提取其中任意一个字符
    //[^?]* [^?]匹配非问号字符，后面的*表示0次或多次
    //\\?   \\?表示原始的?  字符(.*)表示提取?之后的任意多个字符0次或多次，直到遇到空格
    //(?:\n|\r\n)?  (?:...)     表示匹配某个格式的字符串，但是不提取，最后的?表示的是匹配前边的表达式0次或多次

    bool ret=std::regex_match(str,matches,e);
    if(ret==false){
        return -1;
    }
    for(auto& s:matches){
        std::cout<<s<<std::endl;
    }
    return 0;
}